package com.lt73.ext.service;

import com.lt73.ext.entity.User2;
import com.lt73.ext.entity.dto.User2DetailWithRoleDto;
import com.lt73.ext.repository.User2Repository;
import com.tangzc.mpe.bind.Binder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author: hanxiao
 * @Date: 2022/4/15 12:58
 */
@Slf4j
@Service
public class User2Service {

    @Resource
    private User2Repository user2Repository;

    /**
     * 【推荐】根据用户的名字模糊查询所有用户的详细信息，等价于上一个查询方式
     */
    @Transactional(readOnly = true)
    public List<User2> searchUser2ByName2(String name) {

        // 本框架拓展的lambda查询器lambdaQueryPlus，增加了bindOne、bindList、bindPage
        // 显然这是一种更加简便的查询方式，但是如果存在多级深度的关联关系，此种方法就不适用了，还需要借助Binder
        List<User2> list = user2Repository.lambdaQueryPlus()
                .eq(name != null, User2::getUsername, name)
                // 【推荐】用法一、指定属性关联，只关联身份证号这个字段。
                .bindList(User2::getIdCardNumber);
        // 【不推荐】用法二、全关联。
        // .bindList();
        return list;
//        return User2Mapping.MAPPER.toDto5(User2List);
    }

    /**
     * 根据用户的名字模糊查询所有用户的详细信息
     */
    @Transactional(readOnly = true)
    public List<User2> searchUser2ByName(String name) {

        // MP的lambda查询方式
        List<User2> list = user2Repository.lambdaQuery()
                .eq(name != null, User2::getUsername, name)
                .list();
        // 关键步骤，指定关联角色数据。如果你打开sql打印，会看到3条sql语句，第一条根据id去User2表查询User2信息，第二条根据User2Id去IdentityCard中查询
        // 【推荐】用法一、指定属性关联。
        Binder.bindOn(list, User2::getIdCardNumber);
        Binder.bindOn(list, User2::getArticles);
        // 【不推荐】用法二、全关联。此种用法默认关联User2下所有声明需要绑定的属性。
        // Binder.bind(User2List);
        return list;
//        return User2Mapping.MAPPER.toDto5(User2List);
    }
}
